﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using DotNet.Configuration;
using DotNet.Helper;
using DotNet.Utility;

namespace XNWebAPI
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            LogHelper.Log("Application_Start");
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }

        protected void Application_Error()
        {
            //不是每次请求都调用
            //所有没有处理的错误都会导致这个方法的执行
            Exception lastError = Server.GetLastError();
            if (lastError != null)
            {
                //string errorMessage = string.Empty;
                //对HTTP 404做额外处理，其他错误全部当成500服务器错误
                HttpException httpError = lastError as HttpException;
                if (httpError != null)
                {
                    //获取错误代码
                    int httpCode = httpError.GetHttpCode();
                    if (httpCode == 400 || httpCode == 404)
                    {
                        Response.StatusCode = 404;
                        //跳转到指定的静态404信息页面，根据需求自己更改URL
                        //errorMessage = httpError.Message;
                        Response.ContentType = "application/json";
                        Response.Write(JsonHelper.Serialize(new BoolMessage(false, "无效的请求")));
                        Server.ClearError();
                        return;
                    }
                }
                var errorMessage = lastError.Message;
                Response.StatusCode = 500;
                Response.ContentType = "application/json";
                Response.Write(JsonHelper.Serialize(new BoolMessage(false, "无效的请求")));
                Server.ClearError();
                /*-----------------------------------------------------
                 * 此处代码可根据需求进行日志记录，或者处理其他业务流程
                 * ---------------------------------------------------*/
                LogHelper.Log($"Application_Error:{errorMessage}");
            }
        }

        void Application_End(object sender, EventArgs e)
        {
            //不是每次请求都调用
            //在应用程序关闭时运行的代码，在最后一个HttpApplication销毁之后执行
            //比如IIS重启，文件更新，进程回收导致应用程序转换到另一个应用程序域
            LogHelper.Log("Application_End");
        }

        //void Session_Start(object sender, EventArgs e)
        //{
        //    //不是每次请求都调用
        //    //会话开始时执行
        //}

        //void Session_End(object sender, EventArgs e)
        //{
        //    //不是每次请求都调用
        //    //会话结束或过期时执行
        //    //不管在代码中显式的清空Session或者Session超时自动过期，此方法都将被调用
        //}

        protected void Application_Init(object sender, EventArgs e)
        {
            //不是每次请求都调用
            //在每一个HttpApplication实例初始化的时候执行
            LogHelper.Log("Application_Init");
        }

        protected void Application_Disposed(object sender, EventArgs e)
        {
            //不是每次请求都调用
            //在应用程序被关闭一段时间之后，在.net垃圾回收器准备回收它占用的内存的时候被调用。
            //在每一个HttpApplication实例被销毁之前执行
            LogHelper.Log("Application_Disposed");
        }
    }
}
